The Role of Response Codes in Spatial-Numerical Associations

Click here to see poster presented @ ESCoP2019


Background:

Numbers are thought to be mentally represented on a mental number line running horizontally from left to right (for Western cultures) or vertically from bottom to top for small to large numbers. Many studies suggest the existence of a horizontal spatial numerical association of response codes (SNARC) effect: faster left/right responses for small/large numbers, respectively. Recent studies suggest that vertical spatial numerical associations (SNA) are more robust than horizontal SNAs: vertical SNAs might be conceptual, whereas horizontal SNAs might be an artefact of the respective paradigms (Shaki & Fischer, 2018; Sixtus et al., 2019). We now investigated the relationship between the typical horizontal SNARC effect and two dimensional (horizontal and vertical) SNAs with and without spatially distributed response buttons. We thereby aim to address the questions:

  • Is the SNARC effect an artefact of its response codes, i.e., spatially distributed response buttons?

  • How do SNAs that are spatially primed (i.e., SNARC) relate to conceptual SNAs?

Preparations

Libraries and shortcuts

library(plyr)
library(afex)
library(ggplot2)
library(reshape)
library(data.table)

read_data <- function(directory, separator=","){
  x <- data.frame()
  for(i in list.files(directory)){
    i_dat <- read.delim(paste(directory,"/",i, sep = ""), comment.char="#", sep=separator, header=T)
    x <- rbind(x, i_dat)
  }
  return(x)
}

num <- function(x){
  as.numeric(as.character(x))
}

IES <- function(dat, FUN="mean"){
  dat$rt <- num(dat$rt)
  dat$correct <- num(dat$correct)
  if(FUN=="mean"){
    dat$ies <- mean(dat$rt, na.rm = T) / mean(dat$correct, na.rm = T)
  } else if(FUN=="median"){
    dat$ies <- median(dat$rt, na.rm = T) / mean(dat$correct, na.rm = T)
  }
  return(dat)
}

t_report <- function(ttest){
  if(ttest$p.value[[1]] < 0.001){
    p <- ", p < 0.001"
  }else{
    p <- paste0(", p = ", as.character(round(ttest$p.value[[1]], digits = 3)))
  }
  paste0("t(", ttest$parameter[[1]], ") = ", round(ttest$statistic[[1]], digits = 2), p)
}

bars <- stat_summary(fun.y=mean, geom="bar", position = position_dodge())
errorbars <-  stat_summary(fun.data="mean_se", geom="errorbar",position=position_dodge(width=0.10),width=0.2) 
errorbars2 <-  stat_summary(fun.data="mean_se", geom="errorbar",position=position_dodge(width=0.90),width=0.2) 
points <- stat_summary(fun.y=mean, geom="point")
lines <- stat_summary(fun.y=mean, geom="line")
x_ax <- scale_x_continuous(breaks = c(1,2,8,9))
reg <- geom_smooth(method = lm, se=F)
hline <- geom_hline(yintercept = 0)
vline <- geom_vline(xintercept = 0)

cohens_dz <- function(ttest, do_print = F){
  dz <- abs(as.numeric(ttest[[1]])/sqrt(as.numeric(ttest[[2]]+1)))
  if (do_print){
    print(paste0("Cohen's dz = ", round(dz, 2)))
  } else {
    return(dz)
  }
  
}

layout <- theme_bw() + theme(axis.text = element_text(size = 26), 
                              axis.title=element_text(size=24, face = "bold"),
                              strip.text = element_text(size=18, face = "bold"), 
                              strip.background = element_rect(fill="white"),
                              rect = element_rect(fill = "transparent"),
                              plot.background = element_rect(fill = "transparent", color = NA),
                              title = element_text(size= 22, face="bold"))

layout2 <- theme_bw() + theme(axis.text = element_text(size = 16), 
                              axis.title=element_text(size=20, face = "bold"),
                              # legend.position = "top",
                              legend.text = element_text(size=9),
                              legend.title = element_text(size=10, face="bold"),
                              strip.text = element_text(size=10, face = "bold"), 
                              strip.background = element_rect(fill="white"),
                              legend.position = "none")

The three experiments

We conducted three experiments with the same group of participants which tested for 1) conceptual spatial-numerical associations (SNAs) in a Go/No-go setup including only one central response button, 2) SNAs in combination with alternating response codes (SNARC) including horizontally and vertically aligned response buttons (on a vertically erected button board), and 3) a rather conventional horizontal SNARC effect. (Setups of Experiments 1 and 2 are illustrated at the end of the page).

The first of the three experiments is very similar to https://doi.org/10.3389/fpsyg.2019.00172

The third of the three experiments is a standard SNARC experiment with a left and a right response button and a parity judgement task

In the second experiment, either the horizontally aligned buttons (same as in the third experiment) or the vertically aligned buttons had to be used for responses in a parity judgement task with auditorily presented numbers (1, 2, 8, 9). The response dimension (horizontally or vertically aligned buttons) was communicated via the colour of a central LED button. Responses were given with only one finger (index finger of dominant hand) and each trial was initiated by the participant pressing and holding the central button. The informative colour started after this inital button press. That is, the button board was a vertical wooden board with five buttons: top, right, bottom, left, central - the latter of which could change colour. The setup and experiments were built with arduino (https://www.arduino.cc) and expyriment (https://www.expyriment.org).

read data

read 2D SNA

snas <- read.csv2("snas.csv")
snas <- snas[snas$training=="experiment",]

errors_sna <- ddply(snas, .(subject_id), function(x) 
  data.frame(n_correct_catch=length(x[x$correct==1 & x$catch==1,]$correct), 
             n_correct_noncatch=length(x[x$correct==1 & x$catch==0,]$correct),  
             n_incorrect_catch=length(x[x$correct==-1,]$correct), 
             n_incorrect_noncatch=length(x[x$correct==0,]$correct)))

errorrate_catch <- length(snas[snas$correct==-1&snas$catch==1,]$correct) / length(snas[snas$correct%in%c(-1,1) & snas$catch==1,]$correct)
errorrate_noncatch <- length(snas[snas$correct==0&snas$catch==0,]$correct) / length(snas[snas$correct%in%c(0,1) & snas$catch==0,]$correct)

answers <- read.csv2("answers.csv")
snas <- merge(snas, answers, by="subject_id")
snas <- snas[snas$language != "nongerman",]

errors_sna$errorrate_catch <- errors_sna$n_incorrect_catch / (errors_sna$n_incorrect_catch+errors_sna$n_correct_catch)
errors_sna$errorrate_noncatch <- errors_sna$n_incorrect_noncatch / (errors_sna$n_incorrect_noncatch+errors_sna$n_correct_noncatch)


too_many_errors_SNA <- errors_sna[which(errors_sna$errorrate_catch > mean(errors_sna$errorrate_catch) + 3*sd(errors_sna$errorrate_catch)),]$subject_id

snas$target <- num(snas$target)
## Warning in num(snas$target): NAs durch Umwandlung erzeugt
snas$position_index <- num(snas$position_index)
## Warning in num(snas$position_index): NAs durch Umwandlung erzeugt
snas$rt <- num(snas$rt)
## Warning in num(snas$rt): NAs durch Umwandlung erzeugt

read 2D SNARC (Experiment 2)

snarc <- read.csv2("snarc.csv")
#during training
# snarc <- snarc[snarc$training=="training" & snarc$block==-1,]
#during experiment
snarc <- snarc[snarc$training == "experiment",]

snarc <- merge(snarc, answers, by="subject_id")

snarc <- snarc[snarc$language != "nongerman",]

# "correct" values:
# -999: middle button pressed
# -6: too slow (response)
# -5: too slow (release)
# -1: wrong dimension
print(paste("any incorrect responses: ", as.character(length(snarc[snarc$correct!=1,]$correct))))
## [1] "any incorrect responses:  409"
print(paste("wrong dimension: ", as.character(length(snarc[snarc$correct==-1,]$correct))))
## [1] "wrong dimension:  168"
print(paste("correct dimension, wrong button: ", as.character(length(snarc[snarc$correct==0,]$correct))))
## [1] "correct dimension, wrong button:  204"
print(paste("too slow (release or response): ", as.character(length(snarc[snarc$correct%in%c(-5, -6),]$correct))))
## [1] "too slow (release or response):  27"
print(paste("other error (middle button pressed): ", as.character(length(snarc[snarc$correct==-999,]$correct))))
## [1] "other error (middle button pressed):  10"
errors_snarc <- ddply(snarc, .(subject_id), function(x) 
  data.frame(n_correct=length(x[x$correct==1,]$correct), 
             n_incorrect=length(x[x$correct!=1,]$correct)))

errors_snarc$errorrate <- errors_snarc$n_incorrect / (errors_snarc$n_incorrect+errors_snarc$n_correct)

too_many_errors_snarc <- errors_snarc[which(errors_snarc$errorrate > mean(errors_snarc$errorrate) + 3*sd(errors_snarc$errorrate)),]$subject_id

read 1D SNARC (Experiment 3)

mini_dat <- read.csv2("mini_dat.csv")
mini_dat <- mini_dat[mini_dat$training == "experiment",]

mini_dat$rt <- num(mini_dat$rt)
## Warning in num(mini_dat$rt): NAs durch Umwandlung erzeugt
mini_dat <- merge(mini_dat, answers, by="subject_id")

mini_dat <- mini_dat[mini_dat$language=="german",]

print(paste("any incorrect responses: ", as.character(length(mini_dat[mini_dat$correct!=1,]$correct))))
## [1] "any incorrect responses:  90"
print(paste("too slow: ", as.character(length(mini_dat[mini_dat$correct==-1,]$correct))))
## [1] "too slow:  12"
print(paste("wrong button: ", as.character(length(mini_dat[mini_dat$correct==0,]$correct))))
## [1] "wrong button:  78"
errors_mini_dat <- ddply(mini_dat, .(subject_id), function(x) 
  data.frame(n_correct=length(x[x$correct==1,]$correct), 
             n_incorrect=length(x[x$correct!=1,]$correct)))

errors_mini_dat$errorrate <- errors_mini_dat$n_incorrect / (errors_mini_dat$n_incorrect+errors_mini_dat$n_correct)

too_many_errors_mini_dat <- errors_mini_dat[which(errors_mini_dat$errorrate > mean(errors_mini_dat$errorrate) + 3*sd(errors_mini_dat$errorrate)),]$subject_id

exclude data sets with too many errors in any of the three experiments

snas <- snas[!snas$subject_id %in% too_many_errors_SNA & !snas$subject_id %in% too_many_errors_snarc & !snas$subject_id %in% too_many_errors_mini_dat,]
snarc <- snarc[!snarc$subject_id %in% too_many_errors_SNA & !snarc$subject_id %in% too_many_errors_snarc & !snarc$subject_id %in% too_many_errors_mini_dat,]
mini_dat <- mini_dat[!mini_dat$subject_id %in% too_many_errors_SNA & !mini_dat$subject_id %in% too_many_errors_snarc & !mini_dat$subject_id %in% too_many_errors_mini_dat,]

overall RTs

s1 <- aggregate(data=snas, rt~subject_id+target,mean)
s2 <- aggregate(data=snarc, rt~subject_id+target,mean)
s3 <- aggregate(data=mini_dat, rt~subject_id+target,mean)
s1$experiment <- "2d_sna"
s2$experiment <- "2d_snarc"
s3$experiment <- "1d_snarc"

ggplot(rbind(s1, s2, s3), aes(target, rt, colour=experiment)) + points + lines + errorbars + layout + scale_x_continuous(breaks = c(1, 2, 8, 9))

Analyses 2D SNA (Experiment 1)

preparations 2D SNA (Experiment 1)

snas <- snas[snas$correct != -1,]

sna_noncatch <- snas[snas$catch == 0,]

sna_noncatch$side_position <- ifelse(sna_noncatch$position_index < 5, 1,
                                     ifelse(sna_noncatch$position_index < 10, 2,
                                            ifelse(sna_noncatch$position_index < 15, 3,
                                                   ifelse(sna_noncatch$position_index < 20, 4,5))))

sna_noncatch$side <- factor(sna_noncatch$side_position, labels=c("far_left", "left", "right", "far_right"))

sna_noncatch$generalside <- factor(ifelse(sna_noncatch$position_index < 10, 1,
                                     ifelse(sna_noncatch$position_index < 15, 2,
                                            3)),
                              labels=c("left", "right"))

sna_noncatch$vert_position <- (sna_noncatch$position_index %% 5) + 1
sna_noncatch$vert <- factor(sna_noncatch$vert_position, labels = c("far_down", "down", "up", "far_up"))

sna_noncatch$generalvert <- factor(ifelse(sna_noncatch$position_index %% 5 %in% c(0, 1), 1,
                                     ifelse(sna_noncatch$position_index %% 5 == 2, 2,
                                            3)),
                              labels=c("down", "up"))

sna_noncatch$distance_from_middle <- ifelse(sna_noncatch$position_index == 12, 0, 
                                            ifelse(sna_noncatch$position_index %in% c(6:8,11,13,16:18), 1, 
                                                   ifelse(sna_noncatch$position_index %in% c(0:5,9,10,14,15,19:24), 2, 99)))

sna_noncatch$size_factor <- factor(ifelse(sna_noncatch$target < 5, 1, 2), labels = c("small", "large"))
sna <- sna_noncatch

data_agg <- ddply(sna, .(target, vert, side), summarize, mRT = mean(rt, na.rm=T), mER = 1-mean(correct, na.rm=T))
# no speed-accuracy tradeoff:
cor.test(data_agg$mRT, data_agg$mER)
## 
##  Pearson's product-moment correlation
## 
## data:  data_agg$mRT and data_agg$mER
## t = 5.0363, df = 62, p-value = 4.366e-06
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3377434 0.6928616
## sample estimates:
##       cor 
## 0.5388197
snarcy_hor_general_pre <- data.table(sna)[, .(ies=mean(rt, na.rm = T) / mean(correct, na.rm = T)), by=.(subject_id, generalside, target)]
snarcy_vert_general_pre <- data.table(sna)[, .(ies=mean(rt, na.rm = T) / mean(correct, na.rm = T)), by=.(subject_id, generalvert, target)]

snarcy_hor_general <- merge(snarcy_hor_general_pre[snarcy_hor_general_pre$generalside == "left",], snarcy_hor_general_pre[snarcy_hor_general_pre$generalside=="right",], by=c("subject_id", "target"))
snarcy_hor_general$RminusL <- snarcy_hor_general$ies.y - snarcy_hor_general$ies.x
snarcy_vert_general <- merge(snarcy_vert_general_pre[snarcy_vert_general_pre$generalvert == "down",], snarcy_vert_general_pre[snarcy_vert_general_pre$generalvert=="up",], by=c("subject_id", "target"))
snarcy_vert_general$UminusD <- snarcy_vert_general$ies.y - snarcy_vert_general$ies.x

snarcy_hor_general_slopes <- ddply(snarcy_hor_general, .(subject_id), function(x) coef(lm(RminusL ~ target, data=x)))
snarcy_vert_general_slopes <- ddply(snarcy_vert_general, .(subject_id), function(x) coef(lm(UminusD ~ target, data=x)))


##original rt
snarcy_hor_general_pre_rt <- aggregate(data=sna, rt ~ subject_id + generalside + target, mean)
snarcy_vert_general_pre_rt <- aggregate(data=sna, rt ~ subject_id + generalvert + target, mean)

snarcy_hor_general_rt <- merge(snarcy_hor_general_pre_rt[snarcy_hor_general_pre_rt$generalside == "left",],
                               snarcy_hor_general_pre_rt[snarcy_hor_general_pre_rt$generalside=="right",], by=c("subject_id", "target"))
snarcy_hor_general_rt$RminusL <- snarcy_hor_general_rt$rt.y - snarcy_hor_general_rt$rt.x
snarcy_vert_general_rt <- merge(snarcy_vert_general_pre_rt[snarcy_vert_general_pre_rt$generalvert == "down",],
                                snarcy_vert_general_pre_rt[snarcy_vert_general_pre_rt$generalvert=="up",], by=c("subject_id", "target"))
snarcy_vert_general_rt$UminusD <- snarcy_vert_general_rt$rt.y - snarcy_vert_general_rt$rt.x

snarcy_hor_general_slopes_rt <- ddply(snarcy_hor_general_rt, .(subject_id), function(x) coef(lm(RminusL ~ target, data=x)))
snarcy_vert_general_slopes_rt <- ddply(snarcy_vert_general_rt, .(subject_id), function(x) coef(lm(UminusD ~ target, data=x)))

Prelim analyses

some visualizations (RTs)

ggplot(sna, aes(side, rt)) + points + errorbars + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

ggplot(sna, aes(target, rt, colour=side)) + points + lines + errorbars + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

ggplot(sna, aes(vert, rt)) + points + errorbars + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

ggplot(sna, aes(target, rt, colour=vert)) + points + lines + errorbars + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

ggplot(sna, aes(size_factor, rt, fill = generalside)) + bars + errorbars2 + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

ggplot(sna, aes(size_factor, rt, fill = generalvert)) + bars + errorbars2 + layout
## Warning: Removed 81 rows containing non-finite values (stat_summary).

## Warning: Removed 81 rows containing non-finite values (stat_summary).

#RT general
ddply(sna, .(generalside), summarize, M=mean(rt, na.rm=T), SD=sd(rt, na.rm=T))
##   generalside        M       SD
## 1        left  993.573 445.1189
## 2       right 1033.629 469.2166
ddply(sna, .(generalvert), summarize, M=mean(rt, na.rm=T), SD=sd(rt, na.rm=T))
##   generalvert         M       SD
## 1        down 1076.8269 453.3306
## 2          up  950.3505 453.4368
side_rts <- aggregate(data=sna, rt ~ subject_id + generalside, mean)
t.test(side_rts$rt ~ side_rts$generalside, paired=T)
## 
##  Paired t-test
## 
## data:  side_rts$rt by side_rts$generalside
## t = -3.1363, df = 42, p-value = 0.003122
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -65.56745 -14.22439
## sample estimates:
## mean of the differences 
##               -39.89592
cohens_dz(t.test(side_rts$rt ~ side_rts$generalside, paired=T), T)
## [1] "Cohen's dz = 0.48"
vert_rts <- aggregate(data=sna, rt ~ subject_id + generalvert, mean)
t.test(vert_rts$rt ~ vert_rts$generalvert, paired=T)
## 
##  Paired t-test
## 
## data:  vert_rts$rt by vert_rts$generalvert
## t = 5.7774, df = 42, p-value = 8.3e-07
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##   82.20125 170.45711
## sample estimates:
## mean of the differences 
##                126.3292
cohens_dz(t.test(vert_rts$rt ~ vert_rts$generalvert, paired=T), T)
## [1] "Cohen's dz = 0.88"
#RT
ddply(sna, .(distance_from_middle), summarize, M=round(mean(rt, na.rm=T)), SD=round(sd(rt, na.rm=T)))
##   distance_from_middle    M  SD
## 1                    1  753 325
## 2                    2 1101 462
sna_dist <- aggregate(data=sna, rt ~ subject_id + distance_from_middle, mean)
t.test(sna_dist$rt ~ sna_dist$distance_from_middle, paired=T)
## 
##  Paired t-test
## 
## data:  sna_dist$rt by sna_dist$distance_from_middle
## t = -29.701, df = 42, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -372.0418 -324.7003
## sample estimates:
## mean of the differences 
##               -348.3711
cohens_dz(t.test(sna_dist$rt ~ sna_dist$distance_from_middle, paired=T), T)
## [1] "Cohen's dz = 4.53"
#size
ddply(sna, .(size_factor), summarize, M=mean(rt, na.rm=T), SD=sd(rt, na.rm=T))
##   size_factor         M       SD
## 1       small  936.5168 407.3745
## 2       large 1091.0577 491.3090
size_rts <- aggregate(data=sna, rt ~ subject_id + size_factor, mean)
t.test(size_rts$rt ~ size_rts$size_factor, paired = T)
## 
##  Paired t-test
## 
## data:  size_rts$rt by size_rts$size_factor
## t = -11.299, df = 42, p-value = 2.588e-14
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -182.6454 -127.2890
## sample estimates:
## mean of the differences 
##               -154.9672
cohens_dz(t.test(size_rts$rt ~ size_rts$size_factor, paired = T), T)
## [1] "Cohen's dz = 1.72"

General SNA(RC)

The SNARC effect usually describes faster left side (or spatially lower) responses for small numbers and right side (or spatially upper) responses for large numbers. In this experiment, there was only one response button, but target numbers were presented at different locations in 2D space. Therefore, instead of response locations, we examined presentation locations. We therefore originally expected faster responses for small numbers when presented on the left side and/or in lower space (i.e., lower half of the screen) and for large number when presented on the right side and/or in upper space (i.e., upper half of the screen). In this study we found evidence for this only for the vertical dimension and we expected to find approximately the same in the present study.

horizontal

Here, we inspected the horizontal dimension - both with IES (inverse efficiency score) and RTs as dependent variable. We were especially interested in the IES because it takes account of missed responses which are supposedly responses which would have taken longer than the maximum presentation time of 3 seconds. Interestingly, in the horizontal dimension we found a significant reverse effect. We’re not sure why.

ggplot(snarcy_hor_general, aes(target, RminusL)) +
  points +
  reg +
  x_ax +
  hline +
  coord_cartesian(ylim=c(-150, 75)) +
  labs(title="Horizontal 2D SNA", x = "Target number", y = "dIES (right - left) in ms") +
  layout

# ggsave("sna_hor_poster.png", width = 7, height = 5.5, units='in', dpi=600, bg="transparent")

t_hor_ies <- t.test(snarcy_hor_general_slopes$target, mu = 0)
t_hor_ies
## 
##  One Sample t-test
## 
## data:  snarcy_hor_general_slopes$target
## t = 3.662, df = 42, p-value = 0.0006946
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##   4.070315 14.063628
## sample estimates:
## mean of x 
##  9.066971
t_report(t_hor_ies)
## [1] "t(42) = 3.66, p < 0.001"
cohens_dz(t_hor_ies, T)
## [1] "Cohen's dz = 0.56"
ggplot(snarcy_hor_general_rt, aes(target, RminusL)) + 
  points + 
  reg + 
  x_ax + 
  layout + 
  hline + 
  #coord_cartesian(ylim=c(-120, 100)) + 
  ylab("RT (right - left) in ms") + 
  xlab("Target number")

t_hor_rt <- t.test(snarcy_hor_general_slopes_rt$target, mu = 0)
t_hor_rt
## 
##  One Sample t-test
## 
## data:  snarcy_hor_general_slopes_rt$target
## t = 3.6093, df = 42, p-value = 0.0008113
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##   3.874615 13.702745
## sample estimates:
## mean of x 
##   8.78868
t_report(t_hor_rt)
## [1] "t(42) = 3.61, p < 0.001"
cohens_dz(t_hor_rt, T)
## [1] "Cohen's dz = 0.55"

vertical

Here, we inspected the vertical dimension - both with IES (inverse efficiency score) and RTs as dependent variable. Overall, the original study’s results were replicated.

ggplot(snarcy_vert_general, aes(target, UminusD)) +
  points +
  reg +
  x_ax +
  hline +
  coord_cartesian(ylim=c(-150, 75)) +
  ylab("dIES (top - bottom) in ms") +
  xlab("Target number") +
  labs(title="Vertical 2D SNA" ) +
  layout

# ggsave("sna_vert_poster.png", width = 7, height = 5.5, units='in', dpi=600, bg="transparent")
t_vert_ies <- t.test(snarcy_vert_general_slopes$target, mu = 0)
t_vert_ies
## 
##  One Sample t-test
## 
## data:  snarcy_vert_general_slopes$target
## t = -2.0728, df = 42, p-value = 0.04437
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -9.3769341 -0.1253915
## sample estimates:
## mean of x 
## -4.751163
t_report(t_vert_ies)
## [1] "t(42) = -2.07, p = 0.044"
cohens_dz(t_vert_ies, T)
## [1] "Cohen's dz = 0.32"
ggplot(snarcy_vert_general_rt, aes(target, UminusD)) + 
  points + 
  reg + 
  x_ax + 
  layout + 
  hline + 
  #coord_cartesian(ylim=c(-120, 100)) + 
  ylab("RT (top - bottom) in ms") + 
  xlab("Target number")

t_vert_rt <- t.test(snarcy_vert_general_slopes_rt$target, mu = 0)
t_vert_rt
## 
##  One Sample t-test
## 
## data:  snarcy_vert_general_slopes_rt$target
## t = -1.9971, df = 42, p-value = 0.05232
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -9.11749697  0.04773205
## sample estimates:
## mean of x 
## -4.534882
t_report(t_vert_rt)
## [1] "t(42) = -2, p = 0.052"
cohens_dz(t_vert_rt, T)
## [1] "Cohen's dz = 0.3"

comparison horizontal & vertical slopes

compare_slopes <- t.test(snarcy_hor_general_slopes$target, snarcy_vert_general_slopes$target, paired = T)
compare_slopes
## 
##  Paired t-test
## 
## data:  snarcy_hor_general_slopes$target and snarcy_vert_general_slopes$target
## t = 3.9853, df = 42, p-value = 0.0002631
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##   6.820927 20.815341
## sample estimates:
## mean of the differences 
##                13.81813
cohens_dz(compare_slopes, T)
## [1] "Cohen's dz = 0.61"
compare_rt_slopes <- t.test(snarcy_hor_general_slopes_rt$target, snarcy_vert_general_slopes_rt$target, paired = T)
compare_rt_slopes
## 
##  Paired t-test
## 
## data:  snarcy_hor_general_slopes_rt$target and snarcy_vert_general_slopes_rt$target
## t = 3.8624, df = 42, p-value = 0.000382
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##   6.362074 20.285051
## sample estimates:
## mean of the differences 
##                13.32356
cohens_dz(compare_rt_slopes, T)
## [1] "Cohen's dz = 0.59"

Hor*Vert Here, we tested whether individuals with weaker/stronger horizontal SNAs tended to have weaker/stronger vertical SNAs, respecitvely. However, we found no evidence for that.

slopes_ies <- merge(snarcy_hor_general_slopes, snarcy_vert_general_slopes, by="subject_id")
slopes_ies$Horizontal <- slopes_ies$target.x
slopes_ies$Vertical <- slopes_ies$target.y

ggplot(slopes_ies, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2 +
  labs(title = "2D SNA slopes (IES)")

ggplot(slopes_ies, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2 + reg +
  labs(title = "2D SNA slopes (IES)")#+

  #coord_cartesian(xlim=c(-20,20), ylim=c(-20, 20))

slopes_ies$Hor <- ifelse(slopes_ies$Horizontal < 0, "snarc", "reverse")
slopes_ies$Vert <- ifelse(slopes_ies$Vertical < 0, "snarc", "reverse")
ddply(slopes_ies, .(Hor), summarize, n = length(subject_id))
##       Hor  n
## 1 reverse 32
## 2   snarc 11
ddply(slopes_ies, .(Vert), summarize, n = length(subject_id))
##      Vert  n
## 1 reverse 18
## 2   snarc 25
ddply(slopes_ies, .(Hor,Vert), summarize, n = length(subject_id))
##       Hor    Vert  n
## 1 reverse reverse 15
## 2 reverse   snarc 17
## 3   snarc reverse  3
## 4   snarc   snarc  8
cor.test(slopes_ies$Horizontal, slopes_ies$Vertical)
## 
##  Pearson's product-moment correlation
## 
## data:  slopes_ies$Horizontal and slopes_ies$Vertical
## t = -0.36023, df = 41, p-value = 0.7205
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3505993  0.2483637
## sample estimates:
##         cor 
## -0.05617013
slopes <- merge(snarcy_hor_general_slopes_rt, snarcy_vert_general_slopes_rt, by="subject_id")
slopes$Horizontal <- slopes$target.x
slopes$Vertical <- slopes$target.y

ggplot(slopes, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2 +
  labs(title = "2D SNA slopes (RTs)")

ggplot(slopes, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2 + reg +
  labs(title = "2D SNA slopes (RTs)") #+

  #coord_cartesian(xlim=c(-20,20), ylim=c(-20, 20))

slopes$Hor <- ifelse(slopes$Horizontal < 0, "snarc", "reverse")
slopes$Vert <- ifelse(slopes$Vertical < 0, "snarc", "reverse")
ddply(slopes, .(Hor), summarize, n = length(subject_id))
##       Hor  n
## 1 reverse 31
## 2   snarc 12
ddply(slopes, .(Vert), summarize, n = length(subject_id))
##      Vert  n
## 1 reverse 17
## 2   snarc 26
ddply(slopes, .(Hor,Vert), summarize, n = length(subject_id))
##       Hor    Vert  n
## 1 reverse reverse 14
## 2 reverse   snarc 17
## 3   snarc reverse  3
## 4   snarc   snarc  9
cor.test(slopes$Horizontal, slopes$Vertical)
## 
##  Pearson's product-moment correlation
## 
## data:  slopes$Horizontal and slopes$Vertical
## t = -0.47242, df = 41, p-value = 0.6391
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3658390  0.2318885
## sample estimates:
##         cor 
## -0.07357997

2D SNARC (Experiment 2)

preparations 2D SNARC (Experiment 2)

snarc_complete <- snarc
snarc <- snarc[snarc$correct==1,]
snarc$size <- factor(ifelse(snarc$target < 5, 1, 2), labels = c("small", "large"))
snarc$parity <- factor(ifelse(snarc$target%%2==0, 1, 2), labels=c("even", "odd"))
snarc$button <- factor(ifelse(snarc$pressed_button == "b'le'", 1, ifelse(snarc$pressed_button == "b'ri'", 2, ifelse(snarc$pressed_button == "b'do'", 3, ifelse(snarc$pressed_button=="b'up'", 4, 9)))), labels = c("left", "right", "down", "up"))

pre-visualizations

ggplot(snarc, aes(target, rt)) + lines + points + errorbars + x_ax + layout

ggplot(snarc, aes(target, rt, colour=dimension)) + lines + points + errorbars + x_ax + layout

ggplot(snarc, aes(parity, rt, colour=button, fill=button)) + bars + errorbars + facet_wrap(~dimension, ncol = 4) + layout

ggplot(snarc, aes(parity, rt, colour=dimension, fill=dimension)) + bars + errorbars + layout

ggplot(snarc, aes(target, rt, colour=button)) + lines + points + errorbars + x_ax + layout

ggplot(snarc, aes(as.integer(target>5), rt, colour=button)) + lines + points + errorbars +  layout + scale_x_continuous(breaks = c(0, 1), labels = c("small", "large")) + labs(x = "target size")

#reaction time (rt)
ggplot(snarc, aes(button, rt)) + points + errorbars + layout

“pre-rt”: part of rt from target presentation until release of central button (pre-reaction time)

ggplot(snarc, aes(button, pre_rt)) + points + errorbars + layout

“mt” (movement time): part of rt from release of central button until press of response button (movement time)

ggplot(snarc, aes(button, mt)) + points + errorbars + layout

horizontal

snarc_hor <- snarc[snarc$dimension=="horizontal",]
snarc_hor$side <- snarc_hor$button
snarc_hor$congruency <- factor(ifelse((snarc_hor$side == "left" & snarc_hor$size == "small") | (snarc_hor$side == "right" & snarc_hor$size == "large"), 1, 2), labels = c("congruent", "incongruent"))
ggplot(snarc_hor, aes(congruency, rt)) + points + errorbars + layout

ggplot(snarc_hor, aes(side, rt, colour=congruency)) + points + errorbars + layout

ggplot(snarc_hor, aes(target, rt, colour=congruency, shape=side)) + lines + stat_summary(fun.y=mean, geom="point", size=4) + errorbars + layout + x_ax

ps_agg <- aggregate(data=snarc_hor, rt ~ subject_id + target + side, mean)
ps_agg_snarc <- merge(ps_agg[ps_agg$side=="left",], ps_agg[ps_agg$side=="right",], by=c("subject_id", "target"))
ps_agg_snarc$dRT <- ps_agg_snarc$rt.y - ps_agg_snarc$rt.x
ggplot(ps_agg_snarc, aes(target, dRT)) + points + reg + layout + x_ax + hline + labs(x = "Target number", y = "dRT (right - left) in ms", title = "Horizontal 2D SNARC") + coord_cartesian(ylim = c(-60, 20))

# ggsave("snarc_hor_poster.png", units = "in", width = 7, height = 5.5, dpi = 600, bg="transparent")

movement time

This part is exploratory. Movement times are included only because we found a significant correlation between individual horizontal SNARC slopes with movement times from this experiment with individual (horizontal) SNARC slopes (with normal RTs) from Experiment 3 (1D SNARC) (see correlation analyses farther below). However, we do not know why the correlation manifests specifically in movement times.

ggplot(snarc_hor, aes(congruency, mt)) + points + errorbars + layout

ggplot(snarc_hor, aes(side, mt, colour=congruency)) + points + errorbars + layout

ggplot(snarc_hor, aes(target, mt, colour=congruency, shape=side)) + lines + stat_summary(fun.y=mean, geom="point", size=4) + errorbars + layout + x_ax

ps_agg_mt <- aggregate(data=snarc_hor, mt ~ subject_id + target + side, mean)
ps_agg_snarc_mt <- merge(ps_agg_mt[ps_agg_mt$side=="left",], ps_agg_mt[ps_agg_mt$side=="right",], by=c("subject_id", "target"))
ps_agg_snarc_mt$dMT <- ps_agg_snarc_mt$mt.y - ps_agg_snarc_mt$mt.x
ggplot(ps_agg_snarc_mt, aes(target, dMT)) + points + reg + errorbars + layout + x_ax

slopes_mt <- ddply(ps_agg_snarc_mt, .(subject_id), function(x) coef(lm(dMT ~ target, data=x)))
t.test(slopes_mt$target, mu=0)
## 
##  One Sample t-test
## 
## data:  slopes_mt$target
## t = -1.2936, df = 42, p-value = 0.2029
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -6.336590  1.386245
## sample estimates:
## mean of x 
## -2.475173

vertical

snarc_vert <- snarc[snarc$dimension=="vertical",]
snarc_vert$vert <- snarc_vert$button
snarc_vert$congruency <- factor(ifelse((snarc_vert$vert == "down" & snarc_vert$size == "small") | (snarc_vert$vert == "up" & snarc_vert$size == "large"), 1, 2), labels = c("congruent", "incongruent"))
ggplot(snarc_vert, aes(congruency, rt)) + points + errorbars + layout

ggplot(snarc_vert, aes(vert, rt, colour=congruency)) + points + errorbars + layout

ggplot(snarc_vert, aes(target, rt, colour=congruency, shape=vert)) + lines + stat_summary(fun.y=mean, geom="point", size=4) + errorbars + layout + x_ax

ps_agg_v <- aggregate(data=snarc_vert, rt ~ subject_id + target + vert, mean)
ps_agg_snarc_v <- merge(ps_agg_v[ps_agg_v$vert=="down",], ps_agg_v[ps_agg_v$vert=="up",], by=c("subject_id", "target"))
ps_agg_snarc_v$dRT <- ps_agg_snarc_v$rt.y - ps_agg_snarc_v$rt.x
ggplot(ps_agg_snarc_v, aes(target, dRT)) + points + reg + x_ax + layout + hline + labs(x = "Target number", y = "dRT (top - bottom) in ms", title = "Vertical 2D SNARC") + coord_cartesian(ylim = c(-60, 20))

# ggsave("snarc_vert_poster.png", units = "in", width = 7, height = 5.5, dpi = 600, bg="transparent")

statistics 2D SNARC

snarc_slopes_hor <- ddply(ps_agg_snarc, .(subject_id), function(x) coef(lm(dRT ~ target, data=x)))
snarc_slopes_vert <- ddply(ps_agg_snarc_v, .(subject_id), function(x) coef(lm(dRT ~ target, data=x)))

t.test(snarc_slopes_hor$target, mu=0)
## 
##  One Sample t-test
## 
## data:  snarc_slopes_hor$target
## t = -0.50539, df = 42, p-value = 0.6159
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -6.097818  3.655344
## sample estimates:
## mean of x 
## -1.221237
t_report(t.test(snarc_slopes_hor$target, mu=0))
## [1] "t(42) = -0.51, p = 0.616"
cohens_dz(t.test(snarc_slopes_hor$target, mu=0), T)
## [1] "Cohen's dz = 0.08"
t.test(snarc_slopes_vert$target, mu=0)
## 
##  One Sample t-test
## 
## data:  snarc_slopes_vert$target
## t = -0.15866, df = 42, p-value = 0.8747
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -8.052795  6.878867
## sample estimates:
##  mean of x 
## -0.5869639
t_report(t.test(snarc_slopes_vert$target, mu=0))
## [1] "t(42) = -0.16, p = 0.875"
cohens_dz(t.test(snarc_slopes_vert$target, mu=0), T)
## [1] "Cohen's dz = 0.02"
t.test(snarc_slopes_hor$target, snarc_slopes_vert$target, paired = T)
## 
##  Paired t-test
## 
## data:  snarc_slopes_hor$target and snarc_slopes_vert$target
## t = -0.14007, df = 42, p-value = 0.8893
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -9.772426  8.503880
## sample estimates:
## mean of the differences 
##               -0.634273
slopes_rc <- merge(snarc_slopes_hor, snarc_slopes_vert, by="subject_id")
slopes_rc$Horizontal <- slopes_rc$target.x
slopes_rc$Vertical <- slopes_rc$target.y

ggplot(slopes_rc, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2# +

  #coord_cartesian(xlim=c(-20,20), ylim=c(-20, 20))
ggplot(slopes_rc, aes(Horizontal, Vertical)) + 
  geom_point(size=2.5) + 
  hline + 
  vline + 
  layout2 +
  reg# +

  #coord_cartesian(xlim=c(-20,20), ylim=c(-20, 20))

cor.test(slopes_rc$Horizontal, slopes_rc$Vertical)
## 
##  Pearson's product-moment correlation
## 
## data:  slopes_rc$Horizontal and slopes_rc$Vertical
## t = -0.35105, df = 41, p-value = 0.7273
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3493432  0.2497063
## sample estimates:
##         cor 
## -0.05474318

1D SNARC (Experiment 3)

preparations 1D SNARC (Experiment 3)

print(paste("any incorrect responses: ", as.character(length(mini_dat[mini_dat$correct!=1,]$correct))))
## [1] "any incorrect responses:  67"
print(paste("too slow: ", as.character(length(mini_dat[mini_dat$correct==-1,]$correct))))
## [1] "too slow:  11"
print(paste("wrong button: ", as.character(length(mini_dat[mini_dat$correct==0,]$correct))))
## [1] "wrong button:  56"
mini_dat <- mini_dat[mini_dat$correct==1,]

mini_dat$side <- factor(ifelse(mini_dat$pressed_button=="b'le'", 1, ifelse(mini_dat$pressed_button=="b'ri", 2, 9)), labels = c("left", "right"))
ddply(mini_dat, .(side), summarise, M=mean(rt), SD=sd(rt))
##    side        M       SD
## 1  left 789.6270 177.6681
## 2 right 778.4642 186.5272
ggplot(mini_dat, aes(target, rt)) + bars + errorbars + x_ax + layout

ggplot(mini_dat, aes(target, rt, colour=side)) + points + lines + errorbars + x_ax + layout

mini_dat$size <- factor(ifelse(mini_dat$target < 5, 1, 2), labels = c("small", "large"))
mini_dat$congruency <- factor(ifelse((mini_dat$side == "left" & mini_dat$size == "small") | (mini_dat$side == "right" & mini_dat$size == "large"), 1, 2), labels = c("congruent", "incongruent"))

snarc

pm_agg <- aggregate(data=mini_dat, rt ~ subject_id + target + side, mean)
pm_agg_snarc <- merge(pm_agg[pm_agg$side=="left",], pm_agg[pm_agg$side=="right",], by=c("subject_id", "target"))
pm_agg_snarc$dRT <- pm_agg_snarc$rt.y - pm_agg_snarc$rt.x

ggplot(pm_agg_snarc, aes(target, dRT)) + points + reg + x_ax + hline + labs(x = "Target number", y = "dRT (right - left) in ms", title = "1D SNARC") + coord_cartesian(ylim = c(-60, 20)) + layout

# ggsave("minisnarc_poster.png", units = "in", width = 7, height = 5.5, dpi = 600, bg="transparent")
minisnarc_slopes <- ddply(pm_agg_snarc, .(subject_id), function(x) coef(lm(dRT ~ target, data=x)))
t.test(minisnarc_slopes$target, mu=0)
## 
##  One Sample t-test
## 
## data:  minisnarc_slopes$target
## t = -2.6048, df = 42, p-value = 0.01266
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -9.476459 -1.202783
## sample estimates:
## mean of x 
## -5.339621
t_report(t.test(minisnarc_slopes$target, mu=0))
## [1] "t(42) = -2.6, p = 0.013"
cohens_dz(t.test(minisnarc_slopes$target, mu=0), T) 
## [1] "Cohen's dz = 0.4"

Correlations conventional SNARC * novel paradigms

1D SNARC * 2D SNARC (horizontal)

data_from_multisnarc <- snarc_slopes_hor
data_from_multisnarc$slope_multi_hor <- data_from_multisnarc$target
minisnarc_slopes$slope_mini <- minisnarc_slopes$target
merged_data <- merge(minisnarc_slopes, data_from_multisnarc, by="subject_id")
ggplot(merged_data, aes(slope_multi_hor, slope_mini)) + points + hline + vline + reg + labs(x="Horizontal slopes from 2D SNARC", y = "Slopes from 1D SNARC", subtitle = "Correlation horizontal 2D & 1D SNARC") + layout

# ggsave(filename = "Mini_Multi_correlation.png", width = 7, height = 5.5, dpi = 600, units = "in", bg="transparent")
cor.test(merged_data$slope_mini, merged_data$slope_multi_hor)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_data$slope_mini and merged_data$slope_multi_hor
## t = 1.7943, df = 41, p-value = 0.08014
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.03320787  0.52742781
## sample estimates:
##       cor 
## 0.2698272
merged_mini_multiMT <- merge(minisnarc_slopes, slopes_mt, by="subject_id")
merged_mini_multiMT$multi_MT_hor <- merged_mini_multiMT$target.y
ggplot(merged_mini_multiMT, aes(multi_MT_hor, slope_mini)) + points + hline + vline + reg + layout + labs(x="Horizontal slopes 2D SNARC - Movement Time", y = "Slopes from 1D SNARC")

cor.test(merged_mini_multiMT$slope_mini, merged_mini_multiMT$multi_MT_hor)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_mini_multiMT$slope_mini and merged_mini_multiMT$multi_MT_hor
## t = 2.8099, df = 41, p-value = 0.007563
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1154243 0.6265621
## sample estimates:
##       cor 
## 0.4018376

1D SNARC * 2D SNARC (vertical)

v_data_from_multisnarc <- snarc_slopes_vert
v_data_from_multisnarc$slope_multi_vert <- v_data_from_multisnarc$target
merged_data_v <- merge(minisnarc_slopes, v_data_from_multisnarc, by="subject_id")
ggplot(merged_data_v, aes(slope_multi_vert, slope_mini)) + points + hline + vline + reg + labs(x="Vertical slopes from 2D SNARC", y = "Slopes from 1D SNARC") + layout

# ggsave(filename = "Mini_MultiVert_correlation.png", width = 7, height = 5.5, dpi = 600, units = "in", bg="transparent")

cor.test(merged_data_v$slope_mini, merged_data_v$slope_multi_vert)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_data_v$slope_mini and merged_data_v$slope_multi_vert
## t = -0.0079194, df = 41, p-value = 0.9937
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3014687  0.2992182
## sample estimates:
##        cor 
## -0.0012368

1D SNARC * 2D SNA (horizontal)

sna_hor_slopes_from_other <- snarcy_hor_general_slopes
sna_hor_slopes_from_other$sna_slope_hor <- sna_hor_slopes_from_other$target
minisnarc_slopes$minisnarc_slope <- minisnarc_slopes$target
merged_sna_mini <- merge(minisnarc_slopes, sna_hor_slopes_from_other, by="subject_id")
ggplot(merged_sna_mini, aes(sna_slope_hor, minisnarc_slope)) + points + hline + vline + reg + labs(x="Horizontal slopes from 2D SNA", y = "Slopes from 1D SNARC", subtitle = "Correlation horizontal SNA & 1D SNARC") + layout

# ggsave(filename = "Mini_SNA_correlation.png", width = 7, height = 5.5, dpi = 600, units = "in", bg="transparent")

cor.test(merged_sna_mini$sna_slope_hor, merged_sna_mini$minisnarc_slope)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_sna_mini$sna_slope_hor and merged_sna_mini$minisnarc_slope
## t = -0.76665, df = 41, p-value = 0.4477
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.4047724  0.1881819
## sample estimates:
##        cor 
## -0.1188811

1D SNARC * 2D SNA (vertical)

sna_vert_slopes_from_other <- snarcy_vert_general_slopes
sna_vert_slopes_from_other$sna_slope_vert <- sna_vert_slopes_from_other$target
merged_snaV_mini <- merge(minisnarc_slopes, sna_vert_slopes_from_other, by="subject_id")
ggplot(merged_snaV_mini, aes(sna_slope_vert, minisnarc_slope)) + points + hline + vline + reg + labs(x="Vertical slopes from 2D SNA", y = "Slopes from 1D SNARC", subtitle = "Correlation vertical SNA & 1D SNARC") + layout

# ggsave(filename = "Mini_SNAvert_correlation.png", width = 7, height = 5.5, dpi = 600, units = "in", bg="transparent")

cor.test(merged_snaV_mini$sna_slope_vert, merged_snaV_mini$minisnarc_slope)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_snaV_mini$sna_slope_vert and merged_snaV_mini$minisnarc_slope
## t = -1.9049, df = 41, p-value = 0.06383
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.53930041  0.01662493
## sample estimates:
##        cor 
## -0.2851427

Correlations 2D SNA * 2D SNARC

2D SNA * 2D SNARC (horizontal)

sna_hor_slopes_from_other <- snarcy_hor_general_slopes
sna_hor_slopes_from_other$sna_slope_hor <- sna_hor_slopes_from_other$target
snarc_slopes_hor$snarc_slope_hor <- snarc_slopes_hor$target
merged_data_sna_snarc <- merge(sna_hor_slopes_from_other, snarc_slopes_hor, by="subject_id")
ggplot(merged_data_sna_snarc, aes(sna_slope_hor, snarc_slope_hor)) + points + hline + vline + reg + layout + labs(x="Horizontal slopes 2D SNA", y = "Horizontal slopes 2D SNARC")

cor.test(merged_data_sna_snarc$sna_slope_hor, merged_data_sna_snarc$snarc_slope_hor)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_data_sna_snarc$sna_slope_hor and merged_data_sna_snarc$snarc_slope_hor
## t = -0.43519, df = 41, p-value = 0.6657
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3608049  0.2373689
## sample estimates:
##         cor 
## -0.06780919

2D SNA * 2D SNARC (vertical)

sna_vert_slopes_from_other <- snarcy_vert_general_slopes
sna_vert_slopes_from_other$sna_slope_vert <- sna_vert_slopes_from_other$target
snarc_slopes_vert$snarc_slope_vert <- snarc_slopes_vert$target
merged_data_sna_snarc_v <- merge(sna_vert_slopes_from_other, snarc_slopes_vert, by="subject_id")
ggplot(merged_data_sna_snarc_v, aes(sna_slope_vert, snarc_slope_vert)) + points + hline + vline + reg + layout + labs(x="Vertical slopes 2D SNA", y = "Vertical slopes 2D SNARC")

cor.test(merged_data_sna_snarc_v$sna_slope_vert, merged_data_sna_snarc_v$snarc_slope_vert)
## 
##  Pearson's product-moment correlation
## 
## data:  merged_data_sna_snarc_v$sna_slope_vert and merged_data_sna_snarc_v$snarc_slope_vert
## t = -0.41223, df = 41, p-value = 0.6823
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3576888  0.2407422
## sample estimates:
##         cor 
## -0.06424702

Further things

“task switching”

We did not find evidence for a horizontal nor vertical SNARC effect in the 2D SNARC paradigm. Our best guess so far is that spatial-numerical associations did not manifest on a trial-to-trial basis, but need more time to take effect. That is, switching between the two dimensions might have weakended spatial-numerical associations. In exploratory analyses we therefore also addressed potential effects of these switches between dimensions (or rather, of staying within the same dimension for two or more trials).

taskswitch <- function(df){
  df$switched <- NA
  df$switched_i <- 0
  for(i in df$trial){
    if(i > 0){
      df[df$trial == i,]$switched <- ifelse(df[df$trial == i,]$dimension == df[df$trial == i-1,]$dimension, 0, 1)
      df[df$trial == i,]$switched_i <- ifelse(df[df$trial == i,]$dimension == df[df$trial == i-1,]$dimension, df[df$trial==i-1,]$switched_i + 1, 0)
    } else{
      df[df$trial == i,]$switched_i <- 0

    }
  }
  return(df)
}

snarc_switch <- ddply(snarc_complete, .(subject_id, block), taskswitch)
snarc_switch$switched <- factor(snarc_switch$switched, labels = c("repeated dimension", "switched dimension"))
snarc_switch <- snarc_switch[snarc_switch$correct==1,]
snarc_switch$size <- factor(ifelse(snarc_switch$target < 5, 1, 2), labels = c("small", "large"))
snarc_switch$parity <- factor(ifelse(snarc_switch$target%%2==0, 1, 2), labels=c("even", "odd"))
snarc_switch_hor <- snarc_switch[snarc_switch$dimension=="horizontal",]
snarc_switch_hor$side <- factor(ifelse(snarc_switch_hor$pressed_button == "b'le'", 1, 2), labels = c("left", "right"))
snarc_switch_hor$congruency <- factor(ifelse((snarc_switch_hor$side == "left" & snarc_switch_hor$size == "small") | (snarc_switch_hor$side == "right" & snarc_switch_hor$size == "large"), 1, 2), labels = c("congruent", "incongruent"))
snarc_switch_vert <- snarc_switch[snarc_switch$dimension=="vertical",]
snarc_switch_vert$vert <- factor(ifelse(snarc_switch_vert$pressed_button == "b'do'", 1, 2), labels = c("down", "up"))
snarc_switch_vert$congruency <- factor(ifelse((snarc_switch_vert$vert == "down" & snarc_switch_vert$size == "small") | (snarc_switch_vert$vert == "up" & snarc_switch_vert$size == "large"), 1, 2), labels = c("congruent", "incongruent"))

horizontal_per_switching

ps_agg_s <- aggregate(data=snarc_switch_hor, rt ~ subject_id + switched + target + side, mean)
ps_agg_snarc_s <- merge(ps_agg_s[ps_agg_s$side=="left",], ps_agg_s[ps_agg_s$side=="right",], by=c("subject_id", "target", "switched"))
ps_agg_snarc_s$dRT <- ps_agg_snarc_s$rt.y - ps_agg_snarc_s$rt.x
ggplot(ps_agg_snarc_s, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~switched)

horizontal_per_multiple_switching

ps_agg_s_mult <- aggregate(data=snarc_switch_hor, rt ~ subject_id + switched_i + target + side, mean)
ps_agg_snarc_s_mult <- merge(ps_agg_s_mult[ps_agg_s_mult$side=="left",], ps_agg_s_mult[ps_agg_s_mult$side=="right",], by=c("subject_id", "target", "switched_i"))
ps_agg_snarc_s_mult$dRT <- ps_agg_snarc_s_mult$rt.y - ps_agg_snarc_s_mult$rt.x
ggplot(ps_agg_snarc_s_mult, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~switched_i)
## Warning: Removed 3 rows containing missing values (geom_errorbar).

# ggplot(ps_agg_snarc, aes(target, dRT)) + points + reg + facet_wrap(~subject_id)

ps_agg_snarc_s_mult$switched_med <- ifelse(ps_agg_snarc_s_mult$switched_i %in% c(1,2), "once_or_twice", ifelse(ps_agg_snarc_s_mult$switched_i%in% c(3,4), "thrice_or_fource", NA))
slopes_switched_med <- ddply(ps_agg_snarc_s_mult[!is.na(ps_agg_snarc_s_mult$switched_med),], .(subject_id, switched_med), function(x) coef(lm(dRT ~ target, data=x)))
slopes_switched_i <- ddply(ps_agg_snarc_s_mult, .(subject_id, switched_i), function(x) coef(lm(dRT ~ target, data=x)))



ggplot(slopes_switched_i, aes(switched_i, target)) + bars + errorbars
## Warning: Removed 33 rows containing non-finite values (stat_summary).
## Warning: Removed 33 rows containing non-finite values (stat_summary).
## Warning: Removed 1 rows containing missing values (geom_errorbar).

ggplot(slopes_switched_med, aes(switched_med, target)) + bars + errorbars
## Warning: Removed 12 rows containing non-finite values (stat_summary).
## Warning: Removed 12 rows containing non-finite values (stat_summary).

for (i in c(0:3)){
  print(t_report(t.test(slopes_switched_i[slopes_switched_i$switched_i==i,]$target, mu = 0)))
}
## [1] "t(42) = -0.11, p = 0.909"
## [1] "t(42) = 0.22, p = 0.825"
## [1] "t(38) = -0.81, p = 0.425"
## [1] "t(11) = 0.74, p = 0.473"

horizontal_per_multiple_switching_MOVEMENT_TIME

ps_agg_s <- aggregate(data=snarc_switch_hor, mt ~ subject_id + switched_i + target + side, mean)
ps_agg_snarc_s_mt <- merge(ps_agg_s[ps_agg_s$side=="left",], ps_agg_s[ps_agg_s$side=="right",], by=c("subject_id", "target", "switched_i"))
ps_agg_snarc_s_mt$dMT <- ps_agg_snarc_s_mt$mt.y - ps_agg_snarc_s_mt$mt.x
ggplot(ps_agg_snarc_s_mt, aes(target, dMT)) + points + reg + errorbars + facet_wrap(~switched_i)
## Warning: Removed 3 rows containing missing values (geom_errorbar).

# ggplot(ps_agg_snarc, aes(target, dMT)) + points + reg + facet_wrap(~subject_id)

ps_agg_snarc_s_mt$switched_med <- ifelse(ps_agg_snarc_s_mt$switched_i %in% c(1,2), "once_or_twice", ifelse(ps_agg_snarc_s_mt$switched_i%in% c(3,4), "thrice_or_fource", NA))
slopes_switched_med <- ddply(ps_agg_snarc_s_mt[!is.na(ps_agg_snarc_s_mt$switched_med),], .(subject_id, switched_med), function(x) coef(lm(dMT ~ target, data=x)))
slopes_switched_i <- ddply(ps_agg_snarc_s_mt, .(subject_id, switched_i), function(x) coef(lm(dMT ~ target, data=x)))



ggplot(slopes_switched_i, aes(switched_i, target)) + bars + errorbars
## Warning: Removed 33 rows containing non-finite values (stat_summary).
## Warning: Removed 33 rows containing non-finite values (stat_summary).
## Warning: Removed 1 rows containing missing values (geom_errorbar).

ggplot(slopes_switched_med, aes(switched_med, target)) + bars + errorbars
## Warning: Removed 12 rows containing non-finite values (stat_summary).
## Warning: Removed 12 rows containing non-finite values (stat_summary).

for (i in c(0:3)){
  print(t_report(t.test(slopes_switched_i[slopes_switched_i$switched_i==i,]$target, mu = 0)))
}
## [1] "t(42) = 0.55, p = 0.587"
## [1] "t(42) = -0.54, p = 0.592"
## [1] "t(38) = -1.06, p = 0.296"
## [1] "t(11) = 1.25, p = 0.238"

horizontal_per_mapping

snarc_switch_hor$horizontal_mappings <- ifelse(snarc_switch_hor$mapping %in% c("left_down_odd", "right_down_odd"), "down_odd", "up_odd")
ps_agg_m <- aggregate(data=snarc_switch_hor, rt ~ subject_id + horizontal_mappings + target + side, mean)
ps_agg_snarc_m <- merge(ps_agg_m[ps_agg_m$side=="left",], ps_agg_m[ps_agg_m$side=="right",], by=c("subject_id", "target", "horizontal_mappings"))
ps_agg_snarc_m$dRT <- ps_agg_snarc_m$rt.y - ps_agg_snarc_m$rt.x

ps_agg_snarc_m_slopes <- ddply(ps_agg_snarc_m, .(subject_id, horizontal_mappings), function(x) coef(lm(dRT ~ target, data=x)))
t.test(ps_agg_snarc_m_slopes[ps_agg_snarc_m_slopes$horizontal_mappings=="down_odd",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_m_slopes[ps_agg_snarc_m_slopes$horizontal_mappings ==     "down_odd", ]$target
## t = -1.1091, df = 42, p-value = 0.2737
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -13.001885   3.779247
## sample estimates:
## mean of x 
## -4.611319
t.test(ps_agg_snarc_m_slopes[ps_agg_snarc_m_slopes$horizontal_mappings=="up_odd",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_m_slopes[ps_agg_snarc_m_slopes$horizontal_mappings ==     "up_odd", ]$target
## t = 0.58706, df = 42, p-value = 0.5603
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -4.559397  8.300287
## sample estimates:
## mean of x 
##  1.870445
ggplot(ps_agg_snarc_m, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~horizontal_mappings)

vertical_per_switching

ps_agg_v_s <- aggregate(data=snarc_switch_vert, rt ~ subject_id + switched + target + vert, mean)
ps_agg_snarc_v_s <- merge(ps_agg_v_s[ps_agg_v_s$vert=="down",], ps_agg_v_s[ps_agg_v_s$vert=="up",], by=c("subject_id", "target", "switched"))
ps_agg_snarc_v_s$dRT <- ps_agg_snarc_v_s$rt.y - ps_agg_snarc_v_s$rt.x


ps_agg_snarc_v_s_slopes <- ddply(ps_agg_snarc_v_s, .(subject_id, switched), function(x) coef(lm(dRT ~ target, data=x)))
t.test(ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched=="repeated dimension",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched == "repeated dimension",     ]$target
## t = 0.76846, df = 42, p-value = 0.4465
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -6.756014 15.065344
## sample estimates:
## mean of x 
##  4.154665
t.test(ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched=="switched dimension",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched == "switched dimension",     ]$target
## t = -1.5724, df = 42, p-value = 0.1234
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -16.955156   2.104588
## sample estimates:
## mean of x 
## -7.425284
t.test(ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched=="repeated dimension",]$target, ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched=="switched dimension",]$target, paired = T)
## 
##  Paired t-test
## 
## data:  ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched == "repeated dimension",  and ps_agg_snarc_v_s_slopes[ps_agg_snarc_v_s_slopes$switched == "switched dimension",     ]$target and     ]$target
## t = 1.7042, df = 42, p-value = 0.09573
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.132822 25.292719
## sample estimates:
## mean of the differences 
##                11.57995
ggplot(ps_agg_snarc_v_s, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~switched)

# ggplot(ps_agg_snarc_v, aes(target, dRT)) + points + reg + facet_wrap(~subject_id)

vertical_per_multiple_switching

ps_agg_s_v_i <- aggregate(data=snarc_switch_vert, rt ~ subject_id + switched_i + target + vert, mean)
ps_agg_snarc_s_v <- merge(ps_agg_s_v_i[ps_agg_s_v_i$vert=="down",], ps_agg_s_v_i[ps_agg_s_v_i$vert=="up",], by=c("subject_id", "target", "switched_i"))
ps_agg_snarc_s_v$dRT <- ps_agg_snarc_s_v$rt.y - ps_agg_snarc_s_v$rt.x
ggplot(ps_agg_snarc_s_v, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~switched_i)
## Warning: Removed 2 rows containing missing values (geom_errorbar).

# ggplot(ps_agg_snarc, aes(target, dRT)) + points + reg + facet_wrap(~subject_id)

ps_agg_snarc_s_v$switched_med <- ifelse(ps_agg_snarc_s_v$switched_i %in% c(1), 1, ifelse(ps_agg_snarc_s_v$switched_i%in% c(2,3), 2, NA))
slopes_switched_med <- ddply(ps_agg_snarc_s_v[!is.na(ps_agg_snarc_s_v$switched_med),], .(subject_id, switched_med), function(x) coef(lm(dRT ~ target, data=x)))
slopes_switched_i <- ddply(ps_agg_snarc_s_v, .(subject_id, switched_i), function(x) coef(lm(dRT ~ target, data=x)))



ggplot(slopes_switched_i, aes(switched_i, target)) + bars + errorbars
## Warning: Removed 31 rows containing non-finite values (stat_summary).
## Warning: Removed 31 rows containing non-finite values (stat_summary).

ggplot(slopes_switched_med, aes(switched_med, target)) + bars + errorbars

vertical_per_multiple_switching_MOVEMENT_TIME

ps_agg_s_v_i <- aggregate(data=snarc_switch_vert, mt ~ subject_id + switched_i + target + vert, mean)
ps_agg_snarc_s_v <- merge(ps_agg_s_v_i[ps_agg_s_v_i$vert=="down",], ps_agg_s_v_i[ps_agg_s_v_i$vert=="up",], by=c("subject_id", "target", "switched_i"))
ps_agg_snarc_s_v$dMT <- ps_agg_snarc_s_v$mt.y - ps_agg_snarc_s_v$mt.x
ggplot(ps_agg_snarc_s_v, aes(target, dMT)) + points + reg + errorbars + facet_wrap(~switched_i)
## Warning: Removed 2 rows containing missing values (geom_errorbar).

# ggplot(ps_agg_snarc, aes(target, dMT)) + points + reg + facet_wrap(~subject_id)

ps_agg_snarc_s_v$switched_med <- ifelse(ps_agg_snarc_s_v$switched_i %in% c(1), 1, ifelse(ps_agg_snarc_s_v$switched_i%in% c(2,3), 2, NA))
slopes_switched_med <- ddply(ps_agg_snarc_s_v[!is.na(ps_agg_snarc_s_v$switched_med),], .(subject_id, switched_med), function(x) coef(lm(dMT ~ target, data=x)))
slopes_switched_i <- ddply(ps_agg_snarc_s_v, .(subject_id, switched_i), function(x) coef(lm(dMT ~ target, data=x)))



ggplot(slopes_switched_i, aes(switched_i, target)) + bars + errorbars
## Warning: Removed 31 rows containing non-finite values (stat_summary).
## Warning: Removed 31 rows containing non-finite values (stat_summary).

ggplot(slopes_switched_med, aes(switched_med, target)) + bars + errorbars

vertical_per_mapping

snarc_switch_vert$vertical_mappings <- ifelse(snarc_switch_vert$mapping %in% c("left_down_odd", "left_up_odd"), "left_odd", "right_odd")
ps_agg_m_v <- aggregate(data=snarc_switch_vert, rt ~ subject_id + vertical_mappings + target + vert, mean)
ps_agg_snarc_m_v <- merge(ps_agg_m_v[ps_agg_m_v$vert=="down",], ps_agg_m_v[ps_agg_m_v$vert=="up",], by=c("subject_id", "target", "vertical_mappings"))
ps_agg_snarc_m_v$dRT <- ps_agg_snarc_m_v$rt.y - ps_agg_snarc_m_v$rt.x

ps_agg_snarc_m_v_slopes <- ddply(ps_agg_snarc_m_v, .(subject_id, vertical_mappings), function(x) coef(lm(dRT ~ target, data=x)))
t.test(ps_agg_snarc_m_v_slopes[ps_agg_snarc_m_v_slopes$vertical_mappings=="left_odd",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_m_v_slopes[ps_agg_snarc_m_v_slopes$vertical_mappings ==     "left_odd", ]$target
## t = 0.67266, df = 42, p-value = 0.5048
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -5.927065 11.853691
## sample estimates:
## mean of x 
##  2.963313
t.test(ps_agg_snarc_m_v_slopes[ps_agg_snarc_m_v_slopes$vertical_mappings=="right_odd",]$target, mu=0)
## 
##  One Sample t-test
## 
## data:  ps_agg_snarc_m_v_slopes[ps_agg_snarc_m_v_slopes$vertical_mappings ==     "right_odd", ]$target
## t = -0.82287, df = 42, p-value = 0.4152
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -13.353770   5.618035
## sample estimates:
## mean of x 
## -3.867868
ggplot(ps_agg_snarc_m_v, aes(target, dRT)) + points + reg + errorbars + facet_wrap(~vertical_mappings)

Illustrations

Setup of Experiment 1 (2D SNA)

2D SNA (Experiment 1)

Setup of Experiment 2 (2D SNARC)

2D SNARC (Experiment 2)

The same button board was used for Experiment 3 (1D SNARC). However, only the leftmost and rightmost button were used and participants were asked to use their left and right index finger, respectively, to press the buttons.

Procedure of Experiment 1 (2D SNA)

Procedure 2D SNA (Experiment 1)

Auditory stimuli (and target stimuli) were 1, 2, 8, and 9. (“Neun” is German for “nine”.)

Instruction sheet of Experiment 2

Instruction sheet 2D SNARC (Experiment 2)

Colour codes were balanced between participants (i.e., yellow or blue for horizontally or vertically aligned buttons). Each participant absoved each of the four possible parity-to-position mappings. (“gerade” and “ungerade” is German for “even” and “odd”, respectively.)

Instruction sheet of Experiment 3

Instruction sheet 1D SNARC (Experiment 3)

Each participant absolved each of the two possible parity-to-position mappings.(“gerade” and “ungerade” is German for “even” and “odd”, respectively.)